package com.java.jvm.demo.chapter02;

/**
 * 面试题：
 * 方法中定义的局部变量是否线程安全
 * 何为线程安全？
 * 		如果只有一个线程能够操作此数据，则必是线程安全的
 * 		如果有多个线程，此数据是共享数据，如果不考虑同步机制的话，会存在线程安全问题
 * @author wangning
 * @create 2021-10-25 21:12
 */
public class StringBuilderTest {

	//整体来说stringBuilder是线程安全的，因为在方法内部直接消亡
	public static void method1(){
		//StingBuilder线程不安全
		StringBuilder stringBuilder = new StringBuilder();
		stringBuilder.append("a");
		stringBuilder.append("b");
		//...

	}

	//此时stringBuilder的操作过程是线程不安全的
	public static void method2(StringBuilder stringBuilder) {
		stringBuilder.append("a");
		stringBuilder.append("b");
		//...
	}

	//此时的stringBuilder有可能是线程不安全的
	public static StringBuilder method3() {
		StringBuilder stringBuilder = new StringBuilder();
		stringBuilder.append("a");
		stringBuilder.append("b");
		return stringBuilder;
	}

	//此时的stringBuilder是线程安全的，因为在本方法内直接消亡
	public static String method4() {
		StringBuilder stringBuilder = new StringBuilder();
		stringBuilder.append("a");
		stringBuilder.append("b");
		return stringBuilder.toString();
	}

	public static void main(String[] args) {
		StringBuilder s = new StringBuilder();
		new Thread(() -> {
			s.append("a");
			s.append("b");

		}).start();

		method2(s);
	}
}
